import { IndexBase } from "./IndexBase";

/**
 * 三角面索引结构。
 *
 */
export class TriIndex {
    public a: number;
    public b: number;
    public c: number;
    public constructor(a?: number, b?: number, c?: number) {
        this.a = (a !== null) ? a : -1;
        this.b = (b !== null) ? b : -1;
        this.c = (c !== null) ? c : -1;
    }

    /**
     * 等于。
     * 
     * @param tri
     */
    public equals(tri: TriIndex): boolean {
        return (this.a == tri.a) && (this.b == tri.b) && (this.c == tri.c);
    }

    /**
     * 小于。
     * 
     * @param tri
     */
    public lessThan(tri: TriIndex): number {
        if (this.a < tri.a) return 1;
        if (this.a == tri.a) {
            if (this.b < tri.b) {
                return 1;
            }

            if (this.b == tri.b) {
                return (this.c < tri.c) ? 1 : -1;
            }
        }
        return -1;
    }
}

/**
 * 索引三角形类。
 * 
 */
export class IndexTriangle implements IndexBase {
    //顶点标识。
    public label: number[] = [3];
    //构造函数。
    public constructor(label0?: number, label1?: number, label2?: number) {
        this.label[0] = (label0 !== undefined) ? label0 : -1;
        this.label[1] = (label1 !== undefined) ? label1 : -1;
        this.label[2] = (label2 !== undefined) ? label2 : -1;
    }

    /**
     * 判断是否小于。
     * 
     * @param tri 三角形。
     */
    public lessThan(tri: IndexTriangle): boolean {
        if (this.label[2] < tri.label[2]) return true;
        if (this.label[2] == tri.label[2]) {
            if (this.label[1] < tri.label[1]) {
                return true;
            }

            if (this.label[1] == tri.label[1]) {
                return this.label[0] < tri.label[0];
            }
        }
        return false;
    }

    /**
     * 判断是否相等。
     * 
     * @param tri 三角形。
     */
    public equals(tri: IndexTriangle): boolean {
        return (this.label[0] == tri.label[0]) &&
            ((this.label[1] == tri.label[1] && this.label[2] == tri.label[2])
                || (this.label[1] == tri.label[2] && this.label[2] == tri.label[1]));
    }

    /**
     * 判断是否不等。
     * 
     * @param tri 三角形。
     */
    public unequals(tri: IndexTriangle): boolean {
        return !this.equals(tri);
    }
}